Populate Dynamically from a Table

Description

This example of a tree control shows how to use the X directive to dynamically populate the branches of a tree control from a table. It shows the use of the {DATA} command to return values different than displayed and the {EXPAND} command to display a message when populating a branch takes longer than 2 seconds.

images/XD_Dynamic_Tree_Control.gif

The contentExpn, filterExpn, and orderExpn expressions specify that the list will contain unique values from the bill_state_region field ordered by bill_state_region. After calling the expandState()and expandCity()functions to generate values for lower branches of the tree, the TABLE.EXTERNAL_RECORD_CONTENT_GET()method returns the CR-LF delimited list.

contentExpn = "alltrim(bill_state_region) + '|{EXPAND=Expanding tree...}!expandState(' + quote(alltrim(bill_state_region) ) + ')'"
filterExpn = "bill_state_region <> '' .and. unique_key_value()"
orderExpn = "bill_state_region"
treeList = table.external_record_content_get(tablename,contentExpn,orderExpn,filterExpn)

The X directive in the tree control syntax says that functions will be providing the contents of the branches of the tree. The D directive says that the "|" character separates the parent node from the function that defines its branches.

[%X;S=BLR;D="|"%.50,20selected^

The expandState()function dynamically generates the expanded list of cities for a selected state.

function expandState as C (state as C)
ui_yield()
dim filterExpn as C
dim orderExpn as C
dim contentExpn as C
dim tablename as C
tablename = "customer"
contentExpn = "alltrim(bill_city) + '|{EXPAND=Expanding tree...}!expandCity(' + quote(alltrim(bill_city) ) + ')'"
filterExpn = "unique_key_value().and. bill_state_region=" + quote(state)
orderExpn = "bill_city"
expandState = table.external_record_content_get(tablename, contentExpn, orderExpn, filterExpn)
if expandState = "" then

expandState = ""
end if
end function

The expandCity()function dynamically generates the expanded list of customer names for a selected city.

function expandCity as c (city as c )
ui_yield()
dim filterExpn as C
dim orderExpn as C
dim contentExpn as C
dim tablename as C
tablename = "customer"
contentExpn = "'{DATA=ID:' + customer_id + '}' + alltrim(lastname) + ', ' + alltrim(firstname)"
filterExpn = "unique_key_value().and. bill_city=" + quote(city)
orderExpn = "lastname"
expandCity = table.external_record_content_get(tablename, contentExpn, orderExpn, filterExpn)
if expandCity = "" then

expandCity = ""
end if
end function

Limitations

Desktop applications only.

See Also